package src;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import parser.Parser;

public class Analizador {
	
	static int indice;
	static String word;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		boolean belongs=false;
		boolean found = false;
		BufferedReader in= new BufferedReader( new InputStreamReader( System.in ));
		
		System.out.println("Analizador de palabras para lenguajes LL(1)\n");
		System.out.println("Ingrese el nombre del archivo donde se encuentra " +
		"la gramatica LL(1), o exit para salir del programa");
		
		Parser parser=null;
		String file = null;
		do {
			
			try {
				file = in.readLine();
				parser = new Parser(file);
				found = true;
			} catch (FileNotFoundException e) {
				System.out.println("Archivo inexistente. Intentelo nuevamente");
				found=false;
			}catch (IOException e) {
				e.printStackTrace();
			}
			
		} while (!found);
		System.out.println("Ingrese una palabra");
		try {
			
			while ((word=in.readLine()) !=null) {
				
				if (word.equalsIgnoreCase("exit")) {
					return;
				}
				word=word.concat("\\");
				try {
					indice=0;
					belongs=checkWord2('S', parser) && word.charAt(indice) == '\\';
				} catch (StringIndexOutOfBoundsException e) {
					belongs=false;
				}
				
				if (belongs) {
					System.out.println("La palabra pertenece al lenguaje");
				}else {
					System.out.println("La palabra no pertenece al lenguaje");
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private static boolean checkWord2(char noTerminal, /*String word,*/ Parser parser) {
		
		boolean ans = true;
		String prod;
		
		prod = parser.getNextProd(noTerminal,word.charAt(indice));
		
		if(prod==null)
			return false;
		
		for (char car : prod.toCharArray()) {
			if (car==Parser.MARCA_EOF) {
				return true;
			}
			if (Character.isUpperCase(car)) {
				ans = ans && checkWord2(car, parser);
				//i--;
			}else if (car!=word.charAt(indice)) {
				return false;
			}else
				indice++;

		}
		
		
		return ans;
	}

}
